package service.impl;

import global.Constants;
import global.beanUtils.BeanUtils;
import global.security.SessionUtils;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import service.NoteService;
import util.DateUtils;
import util.FileUtils;
import util.ServletHelp;
import util.StringUtils;
import dao.NoteDAO;
import domain.Note;

/**
 * 笔记Service实现类.
 * <p>
 * 创建日期：2010-07-01<br>
 * 创建人：Xiyt<br>
 * 修改日期：<br>
 * 修改人：<br>
 * 修改内容：<br>
 * 
 * @author Xiyt
 * @version 1.0
 */
public class NoteServiceImpl implements NoteService {
	/**
	 * 日记DAO
	 * */
	private NoteDAO noteDao = null;

	/**
	 * 设定日记DAO
	 * */
	public void setNoteDao(NoteDAO noteDao) {
		this.noteDao = noteDao;
	}

	/**
	 * 根据日记ID查询日记信息
	 * @param noteId 日记ID
	 * @return Note 日记
	 */
	public Note selectByPrimaryKey(int noteId) {
		Note note = noteDao.selectByPrimaryKey(noteId);
		return note;
	}

	/**
	 * 根据条件查询日记数量
	 * @param paramNote 日记
	 * @return int 日记数量
	 */
	public int countByCriteria(Note paramNote) {
		// 根据条件查询日记数量
		paramNote = getConditions(paramNote);
		int count = noteDao.countByCriteria(paramNote);
		return count;
	}

	/**
	 * 根据条件查询日记列表带分页
	 * @param paramNote 日记
	 */
	public List<Note> selectByCriteria(Note paramNote) {
		// 取得noteList
		paramNote = getConditions(paramNote);
		List<Note> noteList = noteDao.selectByCriteria(paramNote);
		return noteList;
	}
	
	/**
	 * 根据条件查询日记列表带分页
	 * @param paramNote 日记
	 */
	public List<Note> selectByCriteriaForPaging(Note paramNote) {
		// 取得noteList
		paramNote = getConditions(paramNote);
		List<Note> noteList = noteDao
				.selectByCriteriaForPaging(paramNote, paramNote.getStart(), paramNote.getLimit());
		if (noteList != null) {
			List<Note> resultList = new ArrayList<Note>();
			for (Note note : noteList) {
				// 日期
				note.setCreateDateStr(DateUtils.formatDate2Str(note.getCreateTime()));
				note.setUpdateDateStr(DateUtils.formatDate2Str(note.getUpdateTime()));
				resultList.add(note);
			}
			return resultList;
		}
		return noteList;
	}
	
	

	/**
	 * 保存日记
	 * @param map 日记
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public void save(Map map) throws Exception{
		Note note = new Note();
		BeanUtils.populate(note, map);
		note.setDelflag(Constants.DEL_FLAG_1);
		note.setStatus(Constants.STATUS_1);

		if(Constants.CHECK_TRUE.equals((String)map.get("saveRemoteImg"))){
			// 保存远程图片
			String savePath = (String) map.get("savePath");
			String content = FileUtils.saveHtmlImgToLocal((String) map.get("domain"), note.getContent(), savePath);
			note.setContent(content);
		}
		
		String type = (String) map.get("type");
		if (type.equals(Constants.TYPE_CREATE)) {
			// 添加笔记
			this.insert(note);
		} else if (type.equals(Constants.TYPE_UPDATE)) {
			// 更新笔记
			this.update(note);
		}
	}

	/**
	 * 添加日记
	 * @param note 日记
	 */
	public void insert(Note note) {
		// 删除区分：未删除
		note.setDelflag(Constants.DEL_FLAG_1);
		// 系统时间
		Timestamp sysdate = new Timestamp(System.currentTimeMillis());
		note.setCreateUser(SessionUtils.getCurrentUserId());
		note.setCreateTime(sysdate);
		note.setUpdateUser(SessionUtils.getCurrentUserId());
		note.setUpdateTime(sysdate);
		noteDao.insert(note);
	}

	/**
	 * 修改日记
	 * @param note 日记
	 */
	public void update(Note note) {
		// 系统时间
		Timestamp sysdate = new Timestamp(System.currentTimeMillis());
		note.setUpdateUser(SessionUtils.getCurrentUserId());
		note.setUpdateTime(sysdate);
		noteDao.updateByPrimaryKey(note);
	}

	/**
	 * 伦理删除日记
	 * @param noteList 日记列表
	 */
	public void deleteNote(String noteIds) {
		List<Note> noteList = new ArrayList<Note>();
		String[] noteIdArr = noteIds.split(",");
		for (int i = 0; i < noteIdArr.length; i++) {
			Note note = new Note();
			note.setNoteId(Integer.parseInt(noteIdArr[i]));
			note.setDelflag(Constants.DEL_FLAG_2);
			noteList.add(note);
			this.update(note);
		}
	}

	/**
	 * 还原已删除日记
	 * @param noteList 日记列表
	 */
	public void returnNote(String noteIds) {
		List<Note> noteList = new ArrayList<Note>();
		String[] noteIdArr = noteIds.split(",");
		for (int i = 0; i < noteIdArr.length; i++) {
			Note note = new Note();
			note.setNoteId(Integer.parseInt(noteIdArr[i]));
			note.setDelflag(Constants.DEL_FLAG_1);
			noteList.add(note);
			this.update(note);
		}
	}

	/**
	 * 移动日记
	 * @param noteList 日记列表
	 */
	public void moveNote(String noteIds, String categoryId) {
		List<Note> noteList = new ArrayList<Note>();
		String[] noteIdArr = noteIds.split(",");
		for (int i = 0; i < noteIdArr.length; i++) {
			Note note = new Note();
			note.setNoteId(Integer.parseInt(noteIdArr[i]));
			note.setCategoryId(Integer.parseInt(categoryId));
			note.setDelflag(Constants.DEL_FLAG_1);
			noteList.add(note);
			this.update(note);
		}
	}

	/**
	 * 删除日记
	 * @param noteIds 日记ID数组
	 */
	public void deleteByNoteIds(String noteIds) {
		String[] noteIdArr = noteIds.split(",");
		for (int i = 0; i < noteIdArr.length; i++) {
			noteDao.deleteByPrimaryKey(Integer.parseInt(noteIdArr[i]));
		}
	}

	/**
	 * 发送日记
	 * @param noteId 日记ID
	 * @param emails 邮箱地址
	 */
	public boolean sendEmail(String noteId, String emails) throws Exception {
		// 返回值
		boolean result = false;
		if (StringUtils.isNotEmpty(noteId) && StringUtils.isNotEmpty(emails)) {
			Note note = this.selectByPrimaryKey(Integer.parseInt(noteId));
			result = ServletHelp.sendEmail(emails, note.getTitle(), note.getContent());
		}

		return result;
	}
	
	/**
	 * 设置公共参数
	 * @param paramNote 参数对象
	 */
	private Note getConditions(Note paramNote){
		paramNote.setCreateUser(SessionUtils.getCurrentUserId());// 当前用户
		return paramNote;
	}
}
